package adapter

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/mars/internal/admin/core/application/client"
	"github.com/mars/internal/admin/core/application/service"
	"github.com/mars/internal/admin/core/domain"
	"github.com/mars/internal/pkg/gins"
	"github.com/mars/pkg/errors"
)

type UserController struct {
	srv       service.Service
	validator *domain.UserValidator
}

func NewUserController(fc domain.Factory) *UserController {
	return &UserController{
		srv:       service.NewService(fc),
		validator: domain.NewUserValidator(),
	}
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 分页查询所有用户信息，支持分页参数
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param size query int false "每页数量" default(10)
// @Param status query string false "用户状态" Enums(active,blocked,deleted)
// @Param role query string false "用户角色" Enums(normal,vip)
// @Param vipType query string false "VIP类型" Enums(monthly,yearly,lifetime)
// @Param keyword query string false "搜索关键字"
// @Param sort query string false "排序字段" default(createTime)
// @Param order query string false "排序方向" Enums(asc,desc) default(desc)
// @Success 200 {object} map[string]interface{} "{"data": [用户列表], "total": 总数}"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/list [get]
func (uc *UserController) GetUserList(cxt *gin.Context) (interface{}, int64, error) {
	// 使用domain层验证器验证查询参数
	_, err := uc.validator.ValidateQueryParams(cxt)
	if err != nil {
		return nil, 0, err
	}

	// 这里暂时还是调用原来的方法，后续需要修改service层以支持新的查询参数
	users, total, err := uc.srv.UserSrv().GetUserList(cxt)
	if err != nil {
		return nil, 0, err
	}

	// 转换为view层结构体
	userViews := client.ToUserViewList(users)
	return userViews, total, nil
}

// GetUser 根据openid获取单个用户信息
// @Summary 获取单个用户详情
// @Description 根据用户的微信openid查询用户详细信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param openid path string false "用户openid（路径参数）"
// @Param openid query string false "用户openid（查询参数）"
// @Success 200 {object} domain.User "用户详细信息"
// @Failure 400 {object} map[string]interface{} "openid参数缺失"
// @Failure 404 {object} map[string]interface{} "用户不存在"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/detail/{openid} [get]
// @Router /api/v1/admin/user/detail [get]
func (uc *UserController) GetUser(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证openid
	openid, err := uc.validator.ValidateOpenID(cxt, "openid")
	if err != nil {
		return nil, err
	}

	user, err := uc.srv.UserSrv().GetUser(cxt, openid)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	userView := client.ToUserView(user)
	return userView, nil
}

// CreateUser 创建新用户
// @Summary 创建新用户
// @Description 创建新的微信小程序用户，需要提供用户基本信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body domain.User true "用户信息"
// @Success 200 {object} map[string]interface{} "{"message": "User created successfully"}"
// @Failure 400 {object} map[string]interface{} "请求参数错误或用户已存在"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 403 {object} map[string]interface{} "权限不足"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/create [post]
func (uc *UserController) CreateUser(cxt *gin.Context) (interface{}, error) {
	var user domain.User
	if err := cxt.ShouldBindJSON(&user); err != nil {
		return nil, errors.New(http.StatusBadRequest, "invalid JSON format: "+err.Error())
	}

	// 使用domain层验证器验证用户数据
	if err := uc.validator.ValidateUser(&user); err != nil {
		return nil, err
	}

	err := uc.srv.UserSrv().CreateUser(cxt, &user)
	if err != nil {
		return nil, err
	}

	return gin.H{"message": "User created successfully"}, nil
}

// UpdateUser 更新用户信息
// @Summary 更新用户信息
// @Description 根据openid更新用户信息，支持部分字段更新，包括基本信息修改、状态变更、封禁解封、逻辑删除等操作
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param openid path string false "用户openid（路径参数）"
// @Param openid query string false "用户openid（查询参数）"
// @Param user body domain.User true "用户信息 - 支持以下操作类型"
// @Success 200 {object} map[string]interface{} "{"message": "User updated successfully"}"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 403 {object} map[string]interface{} "权限不足"
// @Failure 404 {object} map[string]interface{} "用户不存在"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/update/{openid} [put]
// @Router /api/v1/admin/user/update [put]
//
// 支持的操作类型及JSON示例：
//
// 1. 更新基本信息：
//
//	{
//	  "nickName": "新昵称",
//	  "avatarUrl": "https://example.com/avatar.jpg",
//	  "gender": 1,
//	  "country": "中国",
//	  "province": "广东省",
//	  "city": "深圳市"
//	}
//
// 2. 封禁用户：
//
//	{
//	  "status": "blocked"
//	}
//
// 3. 解封用户：
//
//	{
//	  "status": "active"
//	}
//
// 4. 逻辑删除用户：
//
//	{
//	  "status": "deleted"
//	}
//
// 5. 修改用户角色：
//
//	{
//	  "role": "vip"
//	}
//
// 6. 组合更新（同时修改多个字段）：
//
//	{
//	  "nickName": "新昵称",
//	  "status": "active",
//	  "role": "vip"
//	}
//
// 注意：
// - 只传递需要更新的字段，未传递的字段保持不变
// - status可选值：active(正常)、blocked(封禁)、deleted(逻辑删除)
// - role可选值：normal(普通用户)、vip(VIP用户)
// - gender可选值：0(未知)、1(男)、2(女)
func (uc *UserController) UpdateUser(cxt *gin.Context) (*gins.Response, error) {
	// 使用domain层验证器验证openid
	openid, err := uc.validator.ValidateOpenID(cxt, "openid")
	if err != nil {
		return nil, err
	}

	var user domain.User
	if err := cxt.ShouldBindJSON(&user); err != nil {
		return nil, errors.New(http.StatusBadRequest, "invalid JSON format: "+err.Error())
	}

	// 使用domain层验证器验证用户更新数据
	if err := uc.validator.ValidateUserForUpdate(&user); err != nil {
		return nil, err
	}

	err = uc.srv.UserSrv().UpdateUser(cxt, openid, &user)
	if err != nil {
		return nil, err
	}

	// 根据操作类型返回不同的成功消息
	message := "User updated successfully"
	switch user.Status {
	case "blocked":
		message = "User blocked successfully"
	case "active":
		message = "User unblocked successfully"
	case "deleted":
		message = "User deleted successfully"
	}

	return gins.NewSuccessResponse(message), nil
}

// GetUsersByStatus 根据状态获取用户列表
// @Summary 根据状态查询用户
// @Description 根据用户状态（active/blocked/deleted）查询用户列表
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param status path string false "用户状态（路径参数）" Enums(active,blocked,deleted)
// @Param status query string false "用户状态（查询参数）" Enums(active,blocked,deleted)
// @Success 200 {array} domain.User "用户列表"
// @Failure 400 {object} map[string]interface{} "状态参数错误或无效"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/status/{status} [get]
// @Router /api/v1/admin/user/status [get]
func (uc *UserController) GetUsersByStatus(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证用户状态
	status, err := uc.validator.ValidateUserStatus(cxt, "status")
	if err != nil {
		return nil, err
	}

	users, err := uc.srv.UserSrv().GetUsersByStatus(cxt, status)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	userViews := client.ToUserViewList(users)
	return userViews, nil
}

// GetVIPUsers 获取VIP用户列表
// @Summary 获取VIP用户列表
// @Description 查询所有VIP用户的信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Success 200 {array} domain.User "VIP用户列表"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/vip [get]
func (uc *UserController) GetVIPUsers(cxt *gin.Context) (interface{}, error) {
	users, err := uc.srv.UserSrv().GetVIPUsers(cxt)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	userViews := client.ToUserViewList(users)
	return userViews, nil
}

// UpdateUserVIP 更新用户VIP信息
// @Summary 更新用户VIP信息
// @Description 升级用户为VIP或更新现有VIP用户的VIP信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param openid path string false "用户openid（路径参数）"
// @Param openid query string false "用户openid（查询参数）"
// @Param vipInfo body domain.VipInfo true "VIP信息"
// @Success 200 {object} map[string]interface{} "{"message": "User VIP info updated successfully"}"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 403 {object} map[string]interface{} "权限不足"
// @Failure 404 {object} map[string]interface{} "用户不存在"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/vip/{openid} [put]
// @Router /api/v1/admin/user/vip [put]
func (uc *UserController) UpdateUserVIP(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证openid
	openid, err := uc.validator.ValidateOpenID(cxt, "openid")
	if err != nil {
		return nil, err
	}

	var vipInfo domain.VipInfo
	if err := cxt.ShouldBindJSON(&vipInfo); err != nil {
		return nil, errors.New(http.StatusBadRequest, "invalid JSON format: "+err.Error())
	}

	// 使用domain层验证器验证VIP信息
	if err := uc.validator.ValidateVipInfo(&vipInfo); err != nil {
		return nil, err
	}

	err = uc.srv.UserSrv().UpdateUserVIP(cxt, openid, &vipInfo)
	if err != nil {
		return nil, err
	}

	return gin.H{"message": "User VIP info updated successfully"}, nil
}

// GetUserStats 获取用户统计信息
// @Summary 获取用户统计信息
// @Description 获取用户数量的多维度统计信息，包括总数、VIP数、各状态统计
// @Tags 用户管理
// @Accept json
// @Produce json
// @Success 200 {object} map[string]interface{} "{"total": 总用户数, "vip": VIP用户数, "active": 活跃用户数, "blocked": 封禁用户数}"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/user/stats [get]
func (uc *UserController) GetUserStats(cxt *gin.Context) (interface{}, error) {
	// 获取所有用户
	allUsers, _, err := uc.srv.UserSrv().GetUserList(cxt)
	if err != nil {
		return nil, err
	}

	// 获取VIP用户
	vipUsers, err := uc.srv.UserSrv().GetVIPUsers(cxt)
	if err != nil {
		return nil, err
	}

	// 获取各状态用户数量
	activeUsers, err := uc.srv.UserSrv().GetUsersByStatus(cxt, "active")
	if err != nil {
		return nil, err
	}

	blockedUsers, err := uc.srv.UserSrv().GetUsersByStatus(cxt, "blocked")
	if err != nil {
		return nil, err
	}

	stats := gin.H{
		"total":   len(allUsers),
		"vip":     len(vipUsers),
		"active":  len(activeUsers),
		"blocked": len(blockedUsers),
	}

	return stats, nil
}
